Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


nomadnet/ui/textui/Guide.py 686ca41b4e25a75475c7c27f69a85a37e5ccad17 (686ca41b) Text, 30.66 KB

Tff7b72import T7ee787RNS
Tff7b72import T7ee787urwid
Tff7b72import T7ee787nomadnet
Tff7b72from T7ee787nomadnetT7ee787.T7ee787vendorT7ee787.T7ee787additional_urwid_widgets Tff7b72import Te6edf3IndicativeListBoxTb4b4b4, Te6edf3MODIFIER_KEY
Tff7b72from T7ee787.T7ee787MicronParser Tff7b72import Te6edf3markup_to_attrmaps
Tff7b72from T7ee787nomadnetT7ee787.T7ee787vendorT7ee787.T7ee787Scrollable Tff7b72import Tff7b72*

Tff7b72class T56d364GuideDisplayShortcutsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Te6edf3g Tff7b72= Te6edf3appTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs

Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72= Te6edf3urwidTff7b72.Td2a8ffAttrMapTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffPaddingTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3alignTff7b72=Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffshortcutbarTa5d6ff"Tb4b4b4)

Tff7b72class T56d364ListEntryTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4)Tb4b4b4:
Te6edf3_selectable Tff7b72= Tff7b72True

Te6edf3signals Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffclickTa5d6ff"Tb4b4b4]

Tff7b72def Td2a8ffkeypressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on 'activate' command.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_command_mapTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72!= Te6edf3urwidTff7b72.Td2a8ffACTIVATETb4b4b4:
Tff7b72return Te6edf3key

Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)

Tff7b72def Td2a8ffmouse_eventTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3eventTb4b4b4, Te6edf3buttonTb4b4b4, Te6edf3xTb4b4b4, Te6edf3yTb4b4b4, Te6edf3focusTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on button 1 press.
"""
Tff7b72if Te6edf3button Tff7b72!= T79c0ff1 Tff7b72or Tff7b72not Te6edf3urwidTff7b72.Td2a8ffutilTff7b72.Td2a8ffis_mouse_pressTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)
Tff7b72return Tff7b72True

Tff7b72class T56d364SelectTextTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4)Tb4b4b4:
Te6edf3_selectable Tff7b72= Tff7b72True

Te6edf3signals Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffclickTa5d6ff"Tb4b4b4]

Tff7b72def Td2a8ffkeypressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on 'activate' command.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_command_mapTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72!= Te6edf3urwidTff7b72.Td2a8ffACTIVATETb4b4b4:
Tff7b72return Te6edf3key

Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)

Tff7b72def Td2a8ffmouse_eventTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3eventTb4b4b4, Te6edf3buttonTb4b4b4, Te6edf3xTb4b4b4, Te6edf3yTb4b4b4, Te6edf3focusTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on button 1 press.
"""
Tff7b72if Te6edf3button Tff7b72!= T79c0ff1 Tff7b72or Tff7b72not Te6edf3urwidTff7b72.Td2a8ffutilTff7b72.Td2a8ffis_mouse_pressTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)
Tff7b72return Tff7b72True

Tff7b72class T56d364GuideEntryTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4, Te6edf3parentTb4b4b4, Te6edf3readerTb4b4b4, Te6edf3topic_nameTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8ffparent Tff7b72= Te6edf3parent
Tff7b72selfTff7b72.Td2a8ffreader Tff7b72= Te6edf3reader
Tff7b72selfTff7b72.Td2a8fflast_keypress Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftopic_name Tff7b72= Te6edf3topic_name
Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs

Te6edf3widget Tff7b72= Te6edf3ListEntryTb4b4b4(Te6edf3topic_nameTb4b4b4)
Te6edf3urwidTff7b72.Td2a8ffconnect_signalTb4b4b4(Te6edf3widgetTb4b4b4, Ta5d6ff"Ta5d6ffclickTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffdisplay_topicTb4b4b4, Tff7b72selfTff7b72.Td2a8fftopic_nameTb4b4b4)

Te6edf3style Tff7b72= Ta5d6ff"Ta5d6fftopic_list_normalTa5d6ff"
Te6edf3focus_style Tff7b72= Ta5d6ff"Ta5d6fflist_focusTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffdisplay_widget Tff7b72= Te6edf3urwidTff7b72.Td2a8ffAttrMapTb4b4b4(Te6edf3widgetTb4b4b4, Te6edf3styleTb4b4b4, Te6edf3focus_styleTb4b4b4)
Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdisplay_widgetTb4b4b4)

Tff7b72def Td2a8ffdisplay_topicTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3eventTb4b4b4, Te6edf3topicTb4b4b4)Tb4b4b4:
Te6edf3markup Tff7b72= Te6edf3TOPICSTb4b4b4[Te6edf3topicTb4b4b4]
Te6edf3attrmaps Tff7b72= Te6edf3markup_to_attrmapsTb4b4b4(Te6edf3markupTb4b4b4, Te6edf3url_delegateTff7b72=Tff7b72NoneTb4b4b4)

Te6edf3topic_position Tff7b72= Tff7b72None
Te6edf3index Tff7b72= T79c0ff0
Tff7b72for Te6edf3topic Tff7b72in Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8fftopic_listTb4b4b4:
Te6edf3widget Tff7b72= Te6edf3topicTff7b72.Td2a8ff_original_widget
Tff7b72if Te6edf3widgetTff7b72.Td2a8fftopic_name Tff7b72== Tff7b72selfTff7b72.Td2a8fftopic_nameTb4b4b4:
Te6edf3topic_position Tff7b72= Te6edf3index
Te6edf3index Tff7b72+Tff7b72= T79c0ff1

Tff7b72if Te6edf3topic_position Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8ffilbTff7b72.Td2a8ffselect_itemTb4b4b4(Te6edf3topic_positionTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffreaderTff7b72.Td2a8ffset_content_widgetsTb4b4b4(Te6edf3attrmapsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreaderTff7b72.Td2a8fffocus_readerTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8ffmicron_released_focusTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreaderTff7b72.Td2a8fffocus_topicsTb4b4b4(Tb4b4b4)

Tff7b72class T56d364TopicListTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4, Te6edf3guide_displayTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs

Tff7b72selfTff7b72.Td2a8fffirst_run_entry Tff7b72= Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffFirst RunTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8fftopic_list Tff7b72= Tb4b4b4[
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffIntroductionTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffConcepts & TerminologyTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffHosting a NodeTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffMarkupTa5d6ff"Tb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8fffirst_run_entryTb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffNetwork ConfigurationTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffDisplay TestTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffCredits & LicensesTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4]

Tff7b72selfTff7b72.Td2a8ffilb Tff7b72= Te6edf3IndicativeListBoxTb4b4b4(
Tff7b72selfTff7b72.Td2a8fftopic_listTb4b4b4,
Te6edf3initialization_is_selection_changeTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3highlight_offFocusTff7b72=Ta5d6ff"Ta5d6fflist_off_focusTa5d6ff"
Tb4b4b4)

Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3urwidTff7b72.Td2a8ffLineBoxTb4b4b4(Tff7b72selfTff7b72.Td2a8ffilbTb4b4b4, Te6edf3titleTff7b72=Ta5d6ff"Ta5d6ffTopicsTa5d6ff"Tb4b4b4)Tb4b4b4)


Tff7b72def Td2a8ffkeypressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3key Tff7b72== Ta5d6ff"Ta5d6ffupTa5d6ff" Tff7b72and Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffilbTff7b72.Td2a8fffirst_item_is_selectedTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3nomadnetTff7b72.Td2a8ffNomadNetworkAppTff7b72.Td2a8ffget_shared_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffuiTff7b72.Td2a8ffmain_displayTff7b72.Td2a8ffframeTff7b72.Td2a8ffset_focusTb4b4b4(Ta5d6ff"Ta5d6ffheaderTa5d6ff"Tb4b4b4)
Tff7b72return Tffa657superTb4b4b4(Te6edf3TopicListTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ffkeypressTb4b4b4(Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)

Tff7b72class T56d364GuideDisplayTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3list_width Tff7b72= T79c0ff0.33

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs

Te6edf3topic_text Tff7b72= Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff No topic selectedTa5d6ff"Tb4b4b4, Te6edf3alignTff7b72=Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffleft_area Tff7b72= Te6edf3TopicListTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffright_area Tff7b72= Te6edf3urwidTff7b72.Td2a8ffLineBoxTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffFillerTb4b4b4(Te6edf3topic_textTb4b4b4, Ta5d6ff"Ta5d6fftopTa5d6ff"Tb4b4b4)Tb4b4b4)


Tff7b72selfTff7b72.Td2a8ffcolumns Tff7b72= Te6edf3urwidTff7b72.Td2a8ffColumnsTb4b4b4(
Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6ffweightTa5d6ff"Tb4b4b4, Te6edf3GuideDisplayTff7b72.Td2a8fflist_widthTb4b4b4, Tff7b72selfTff7b72.Td2a8ffleft_areaTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffweightTa5d6ff"Tb4b4b4, T79c0ff1Tff7b72-Te6edf3GuideDisplayTff7b72.Td2a8fflist_widthTb4b4b4, Tff7b72selfTff7b72.Td2a8ffright_areaTb4b4b4)
Tb4b4b4]Tb4b4b4,
Te6edf3dividecharsTff7b72=T79c0ff0Tb4b4b4, Te6edf3focus_columnTff7b72=T79c0ff0
Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffshortcuts_display Tff7b72= Te6edf3GuideDisplayShortcutsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72= Tff7b72selfTff7b72.Td2a8ffcolumns

Tff7b72if Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8fffirstrunTb4b4b4:
Te6edf3entry Tff7b72= Tff7b72selfTff7b72.Td2a8ffleft_areaTff7b72.Td2a8fffirst_run_entry
Te6edf3entryTff7b72.Td2a8ffdisplay_topicTb4b4b4(Te6edf3entryTff7b72.Td2a8ffdisplay_topicTb4b4b4, Te6edf3entryTff7b72.Td2a8fftopic_nameTb4b4b4)

Tff7b72def Td2a8ffset_content_widgetsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3new_contentTb4b4b4)Tb4b4b4:
Te6edf3options Tff7b72= Tff7b72selfTff7b72.Td2a8ffcolumnsTff7b72.Td2a8ffoptionsTb4b4b4(Te6edf3width_typeTff7b72=Ta5d6ff"Ta5d6ffweightTa5d6ff"Tb4b4b4, Te6edf3width_amountTff7b72=T79c0ff1Tff7b72-Te6edf3GuideDisplayTff7b72.Td2a8fflist_widthTb4b4b4)
Te6edf3pile Tff7b72= Te6edf3urwidTff7b72.Td2a8ffPileTb4b4b4(Te6edf3new_contentTb4b4b4)
T8b949e#content = urwid.LineBox(urwid.Filler(pile, "top"))
Te6edf3content Tff7b72= Te6edf3urwidTff7b72.Td2a8ffLineBoxTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffAttrMapTb4b4b4(Te6edf3ScrollBarTb4b4b4(Te6edf3ScrollableTb4b4b4(Te6edf3pileTb4b4b4)Tb4b4b4, Te6edf3thumb_charTff7b72=Ta5d6ff"Tffea00\u2503Ta5d6ff"Tb4b4b4, Te6edf3trough_charTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffscrollbarTa5d6ff"Tb4b4b4)Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffcolumnsTff7b72.Td2a8ffcontentsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3contentTb4b4b4, Te6edf3optionsTb4b4b4)

Tff7b72def Td2a8ffshortcutsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffshortcuts_display

Tff7b72def Td2a8fffocus_topicsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcolumnsTff7b72.Td2a8fffocus_position Tff7b72= T79c0ff0

Tff7b72def Td2a8fffocus_readerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcolumnsTff7b72.Td2a8fffocus_position Tff7b72= T79c0ff1


Te6edf3TOPIC_INTRODUCTION Tff7b72= Ta5d6ff'''Ta5d6ff>Nomad Network

Ta5d6ff`c`*Communicate Freely.`*
Ta5d6ff`a

Ta5d6ffThe intention with this program is to provide a tool to that allows you to build private and resilient communications platforms that are in complete control and ownership of the people that use them.

Ta5d6ffNomad Network is build on LXMF and Reticulum, which together provides the cryptographic mesh functionality and peer-to-peer message routing that Nomad Network relies on. This foundation also makes it possible to use the program over a very wide variety of communication mediums, from packet radio to fiber.

Ta5d6ffNomad Network does not need any connections to the public internet to work. In fact, it doesnTa5d6ff'Ta5d6fft even need an IP or Ethernet network. You can use it entirely over packet radio, LoRa or even serial lines. But if you wish, you can bridge islanded Reticulum networks over the Internet or private ethernet networks, or you can build networks running completely over the Internet. The choice is yours.

Ta5d6ffThe current version of the program should be considered a beta release. The program works well, but there will most probably be bugs and possibly sub-optimal performance in some scenarios. On the other hand, this is the best time to have an influence on the direction of the development of Nomad Network. To do so, join the discussion on the Nomad Network project on GitHub.

Ta5d6ff'''

Te6edf3TOPIC_CONCEPTS Tff7b72= Ta5d6ff'''Ta5d6ff>Concepts and Terminology

Ta5d6ffThe following section will briefly introduce various concepts and terms used in the program.

Ta5d6ff>>Peer

Ta5d6ffA `*peer`* refers to another Nomad Network client, which will generally be operated by another person. But since Nomad Network is a general LXMF client, it could also be any other LXMF client, program, automated system or machine that can communicate over LXMF.

Ta5d6ffAll peers (and nodes) are identified by their `*address`* (which is, technically speaking, a Reticulum destination hash). An address consist of 20 hexadecimal characters, and looks like this:

Ta5d6ff`c<b8ea8f92541c9a275f0e>
Ta5d6ff`l

Ta5d6ffAnyone can choose whatever display name they want, but addresses are always unique, and generated from the unique cryptographic keys of the peer. This is an important point to understand. Since there is not anyone controlling naming or address spaces in Nomad Network, you can easily come across another user with the same display name as you.

Ta5d6ffYour addresses will always be unique though, and you must always verify that the address you are communicating with is matching the address of the peer you expect to be in the other end.

Ta5d6ffTo make this easier, Nomad Network allows you to mark peers and nodes as either `*trusted`*, `*unknown`* or `*untrusted`*. In this way, you can mark the peers and nodes that you know to be legitimate, and easily spot peers with similar names as unrelated.

Ta5d6ff>>Announces

Ta5d6ffAn `*announce`* can be sent by any peer or node on the network, which will notify other peers of its existence, and contains the cryptographic keys that allows other peers to communicate with it.

Ta5d6ffIn the `![ Network ]`! section of the program, you can monitor announces on the network, initiate conversations with announced peers, and announce your own peer on the network. You can also connect to nodes on the network and browse information shared by them.

Ta5d6ff>>Conversations

Ta5d6ffNomad Network uses the term `*conversation`* to signify both direct peer-to-peer messaging threads, and also discussion threads with an arbitrary number of participants that might change over time.

Ta5d6ffBoth things like discussion forums and chat threads can be encapsulated as conversations in Nomad Network. The user interface will indicate the different characteristics a conversation can take, and also what form of transport encryption was used for messages within.

Ta5d6ffIn the `![ Conversations ]`! part of the program you can view and interact with all currently active conversations. You can also edit nickname and trust settings for peers belonging to these conversations here. To edit settings for a peer, select it in the conversation list, and press `!Ctrl-E`!.

Ta5d6ffBy default, Nomad Network will attempt to deliver messages to a peer directly. This happens by first establishing an encrypted link directly to the peer, and then delivering the message over it.

Ta5d6ffIf the desired peer is not available because it has disconnected from the network, this method will obviously fail. In this case, Nomad Network will attempt to deliver the message to a node, which will store and forward it over the network, for later retrieval by the destination peer. The message is encrypted with an ephemeral key before being transmitted to the network, and is only readable by the intended recipient.

Ta5d6ffFor propagated delivery to work, one or more nodes must be available on the network. If one or more trusted nodes are available, Nomad Network will automatically select the most suitable node to send the message via, but you can also manually specify what node to use.

Ta5d6ffTo select a node manually, go to the `![ Network ]`! part of the program, choose the desired node in the `*Known Nodes`* list, and select the `!< Info >`! button. In the `!Node Info`! dialog, you can specify the selected node as the default propagation node.

Ta5d6ff>>Node

Ta5d6ffA Nomad Network `*node`* is an instance of the Nomad Network program that has been configured to host information for other peers and help propagate messages and information on the network.

Ta5d6ffNodes can host pages (similar to webpages) written in a markup-language called `*micron`*, as well as make files and other resources available for download for peers on the network. Nodes also form a distributed message store for offline users, and allows messages to be exchanged between peers that are not online at the same time.

Ta5d6ffIf no nodes exist on a network, all peers will still be able to communicate directly peer-to-peer, but both endpoints of a conversation will need to be available at the same time to converse. When nodes exist on the network, messages will be held and syncronised between nodes for deferred delivery if the destination peer is unavailable. Nodes will automatically discover and peer with each other, and handle synchronisation of message stores.

Ta5d6ffTo learn how to host your own node, read the `*Hosting a Node`* section of this guide.

Ta5d6ff'''

Te6edf3TOPIC_HOSTING Tff7b72= Ta5d6ff'''Ta5d6ff>Hosting a Node

Ta5d6ffTo host a node on the network, you must enable it in the configuration file, by setting `*enable_node`* directive to `*yes`*. You should also configure the other node-related parameters such as the node name and announce interval settings. Once node hosting has been enabled in the configuration, Nomad Network will start hosting your node as soon as the program is lauched, and other peers on the network will be able to connect and interact with content on your node.

Ta5d6ffBy default, no content is defined, apart from a short placeholder home page. To learn how to add your own content, read on.

Ta5d6ff>>Pages

Ta5d6ffNomad Network nodes can host pages similar to web pages, that other peers can read and interact with. Pages are written in a compact markup language called `*micron`*. To learn how to write formatted pages with micron, see the `*Markup`* section of this guide (which is, itself, written in micron). Pages can be linked arbitrarily with hyperlinks, that can also link to pages (or other resources) on other nodes.

Ta5d6ffTo add pages to your node, place micron files in the `*pages`* directory of your Nomad Network programs `*storage`* directory. By default, the path to this will be `!~/.nomadnetwork/storage/pages`!. You should probably create the file `!index.mu`! first, as this is the page that will get served by default to a connecting peer.

Ta5d6ffYou can control how long a peer will cache your pages by including the cache header in a page. To do so, the first line of your page must start with `!#!c=X`!, where `!X`! is the cache time in seconds. To tell the peer to always load the page from your node, and never cache it, set the cache time to zero. You should only do this if there is a real need, for example if your page displays dynamic content that `*must`* be updated at every page view. The default caching time is 12 hours. In most cases, you should not need to include the cache control header in your pages.

Ta5d6ffYou can use a preprocessor such as PHP, bash, Python (or whatever you prefer) to generate dynamic pages. To do so, just set executable permissions on the relevant page file, and be sure to include the interpreter at the beginning of the file, for example `!#!/usr/bin/python3`!.

Ta5d6ff>>Files

Ta5d6ffLike pages, you can place files you want to make available in the `!~/.nomadnetwork/storage/files`! directory. To let a peer download a file, you should create a link to it in one of your pages.

Ta5d6ff>>Links and URLs

Ta5d6ffLinks to pages and resources in Nomad Network use a simple URL format. Here is an example:

Ta5d6ff`!1385edace36466a6b3dd:/page/index.mu`!

Ta5d6ffThe first part is the 10 byte destination address of the node (represented as readable hexadecimal), followed by the `!:`! character. Everything after the `!:`! represents the request path.

Ta5d6ffBy convention, Nomad Network nodes maps all hosted pages under the `!/page`! path, and all hosted files under the `!/file`! path. You can create as many subdirectories for pages and files as you please, and they will be automatically mapped to corresponding request paths.

Ta5d6ffYou can omit the destination address of the node, if you are reffering to a local page or file. You must still keep the `!:`! character. In such a case, the URL to a page could look like this:

Ta5d6ff`!:/page/other_page.mu`!

Ta5d6ffThe URL to a local file could look like this:

Ta5d6ff`!:/file/document.pdf`!

Ta5d6ffLinks can be inserted into micron documents. See the `*Markup`* section of this guide for info on how to do so.

Ta5d6ff'''

Te6edf3TOPIC_CONVERSATIONS Tff7b72= Ta5d6ff'''Ta5d6ff>Conversations

Ta5d6ffConversations in Nomad Network
Ta5d6ff'''


Te6edf3TOPIC_FIRST_RUN Tff7b72= Ta5d6ff'''Ta5d6ff>First Time Information

Ta5d6ffHi there. This first run message will only appear once. It contains a few pointers on getting started with Nomad Network, and getting the most out of the program.

Ta5d6ffYouTa5d6ff'Ta5d6ffre currently located in the guide section of the program. ITa5d6ff'Ta5d6ffm sorry I had to drag you here by force, but it will only happen this one time, I promise. If you ever get lost, return here and peruse the list of topics you see on the left. I will do my best to fill it with answers to mostly anything about Nomad Network.

Ta5d6ffTo get the most out of Nomad Network, you will need a terminal that supports UTF-8 and at least 256 colors, ideally true-color. If your terminal supports true-color, you can go to the `![ Config ]`! menu item, launch the editor and change the configuration.

Ta5d6ffIt is recommended to use a terminal size of at least 122x32. Nomad Network will work with smaller terminal sizes, but the interface might feel a bit cramped.

Ta5d6ffIf you donTa5d6ff'Ta5d6fft already have a Nerd Font installed (see https://www.nerdfonts.com/), I also highly recommend to do so, since it will greatly expand the amount of glyphs, icons and graphics that Nomad Network can use. Once you have your terminal set up with a Nerd Font, go to the `![ Config ]`! menu item and enable Nerd Fonts in the configuration instead of normal unicode glyphs.

Ta5d6ffNomad Network expects that you are already connected to some form of Reticulum network. That could be as simple as the default UDP-based demo interface on your local ethernet network. This short guide wonTa5d6ff'Ta5d6fft go into any details on building networks, but you will find other entries in the guide that deal with network setup and configuration.

Ta5d6ffAt least, if Nomad Network launches, it means that it is connected to a running Reticulum instance, that should in turn be connected to `*something`*, which should get you started.

Ta5d6ffFor more some more information, you can also read the `*Introduction`* section of this guide.

Ta5d6ffNow go out there and explore. This is still early days. See what you can find and create.

Ta5d6ff>>>>>>>>>>>>>>>
Ta5d6ff-Tffea00\u223f
Ta5d6ff<

Ta5d6ff'''

Te6edf3TOPIC_NETWORKS Tff7b72= Ta5d6ff'''Ta5d6ff>Network Configuration

Ta5d6ffNomad Network uses the Reticulum Network Stack for communication and encryption. This means that it will use any interfaces and communications channels already defined in your Reticulum configuration.

Ta5d6ffReticulum supports using many kinds of devices as networking interfaces, and allows you to mix and match them in any way you choose. The number of distinct network topologies you can create with Reticulum is more or less endless, but common to them all is that you will need to define one or more interfaces for Reticulum to use.

Ta5d6ffIf you have not changed the default Reticulum configuration, which should be located at `!~/.reticulum/config`!, you will have one interface active right now. With it, you should be able to communicate with any other peers and nodes that exist on your local ethernet or WiFi network, if your system is connected to one, and most probably nothing else outside of that.

Ta5d6ffTo learn how to configure your Reticulum setup to use LoRa radios, packet radio or other interfaces, or connect to other Reticulum networks via the Internet, the best places to start is to read the relevant parts of the Reticulum Manual, which can be found on GitHub:

Ta5d6ff`c`_https://markqvist.github.io/Reticulum/manual/interfaces.html`_
Ta5d6ff`l

Ta5d6ffIf you donTa5d6ff'Ta5d6fft currently have access to the Internet, the default Reticulum configuration file is also full of examples of all the supported interface types, and it should be relatively simple to get a working setup going just from those examples.

Ta5d6ffFor future reference, you can download the Reticulum Manual in PDF format here:

Ta5d6ff`c`_https://github.com/markqvist/Reticulum/raw/master/docs/ReticulumTa5d6ff%Ta5d6ff20Manual.pdf`_
Ta5d6ff`l

Ta5d6ffIt might be nice to keep that handy when you are not connected to the Internet, as it is full of information and examples that are also very relevant to Nomad Network.

Ta5d6ff>The Unsigned.io Testnet

Ta5d6ffIf you have Internet access, and just want to get started experimenting, you are welcome to join the Unsigned.io RNS Testnet. The testnet is just that, an informal network for testing and experimenting. It will be up most of the time, and anyone can join, but it also means that thereTa5d6ff'Ta5d6ffs no guarantees for service availability.

Ta5d6ffThe Testnet also runs the latest version of Reticulum, often even a short while before it is publicly released, which means strange behaviour might occur. If none of that scares you, add the following interface to your Reticulum configuration file to join:

Ta5d6ff>>
Ta5d6ff[[RNS Testnet Frankfurt]]
Ta5d6ff type = TCPClientInterface
Ta5d6ff interface_enabled = yes
Ta5d6ff outgoing = True
Ta5d6ff target_host = frankfurt.rns.unsigned.io
Ta5d6ff target_port = 4965

Ta5d6ff'''

Te6edf3TOPIC_DISPLAYTEST Tff7b72= Ta5d6ff'''Ta5d6ff>Markup & Color Display Test


Ta5d6ff`cYou can use this section to gauge how well your terminal reproduces the various types of formatting used by Nomad Network.
Ta5d6ff``


Ta5d6ff>>>>>>>>>>>>>>>>>>>>
Ta5d6ff-Tffea00\u223f
Ta5d6ff<


Ta5d6ff>>
Ta5d6ff`a`!This line should be bold, and aligned to the left`!

Ta5d6ff`c`*This one should be italic and centered`*

Ta5d6ff`r`_And this one should be underlined, aligned right`_
Ta5d6ff``

Ta5d6ffThe following line should contain a red gradient bar:
Ta5d6ff`B100 `B200 `B300 `B400 `B500 `B600 `B700 `B800 `B900 `Ba00 `Bb00 `Bc00 `Bd00 `Be00 `Bf00`b

Ta5d6ffThe following line should contain a green gradient bar:
Ta5d6ff`B010 `B020 `B030 `B040 `B050 `B060 `B070 `B080 `B090 `B0a0 `B0b0 `B0c0 `B0d0 `B0e0 `B0f0`b

Ta5d6ffThe following line should contain a blue gradient bar:
Ta5d6ff`B001 `B002 `B003 `B004 `B005 `B006 `B007 `B008 `B009 `B00a `B00b `B00c `B00d `B00e `B00f`b

Ta5d6ffUnicode Glyphs : Tffea00\u2713Ta5d6ff Tffea00\u2715Ta5d6ff Tffea00\u26a0Ta5d6ff Tffea00\u24c3Ta5d6ff Tffea00\u2193

Ta5d6ffNerd Font Glyphs : Tffea00\uf484Ta5d6ff Tffea00\uf9c4Ta5d6ff Tffea00\uf719Ta5d6ff Tffea00\uf502Ta5d6ff Tffea00\uf415Ta5d6ff Tffea00\uf023Ta5d6ff Tffea00\uf06e
Ta5d6ff'''


Te6edf3TOPIC_LICENSES Tff7b72= Ta5d6ff'''Ta5d6ff>Thanks, Acknowledgements and Licenses

Ta5d6ffThis program uses various other software components, without which Nomad Network would not have been possible. Sincere thanks to the authors and contributors of the following projects

Ta5d6ff>>>
Ta5d6ff - `!Cryptography.io`! by `*pyca`*
Ta5d6ff https://cryptography.io/
Ta5d6ff BSD License

Ta5d6ff - `!Urwid`! by `*Ian Ward`*
Ta5d6ff http://urwid.org/
Ta5d6ff LGPL-2.1 License

Ta5d6ff - `!Additional Urwid Widgets`! by `*AFoeee`*
Ta5d6ff https://github.com/AFoeee/additional_urwid_widgets
Ta5d6ff MIT License

Ta5d6ff - `!Scrollable`! by `*rndusr`*
Ta5d6ff https://github.com/rndusr/stig/blob/master/stig/tui/scroll.py
Ta5d6ff GPLv3 License

Ta5d6ff - `!Configobj`! by `*Michael Foord`*
Ta5d6ff https://github.com/DiffSK/configobj
Ta5d6ff BSD License

Ta5d6ff - `!Reticulum Network Stack`! by `*unsignedmark`*
Ta5d6ff https://github.com/markqvist/Reticulum
Ta5d6ff MIT License

Ta5d6ff - `!LXMF`! by `*unsignedmark`*
Ta5d6ff https://github.com/markqvist/LXMF
Ta5d6ff MIT License
Ta5d6ff'''


Te6edf3TOPIC_MARKUP Tff7b72= Ta5d6ff'''Ta5d6ff>Outputting Formatted Text


Ta5d6ff>>>>>>>>>>>>>>>
Ta5d6ff-Tffea00\u223f
Ta5d6ff<

Ta5d6ff`c`!Hello!`! This is output from `*micron`*
Ta5d6ffMicron generates formatted text for your terminal
Ta5d6ff`a

Ta5d6ff>>>>>>>>>>>>>>>
Ta5d6ff-Tffea00\u223f
Ta5d6ff<


Ta5d6ffNomad Network supports a simple and functional markup language called `*micron`*. If you are familiar with `*markdown`* or `*HTML`*, you will feel right at home writing pages with micron.

Ta5d6ffWith micron you can easily create structured documents and pages with formatting, colors, glyphs and icons, ideal for display in terminals.

Ta5d6ff>>Recommendations and Requirements

Ta5d6ffWhile micron can output formatted text to even the most basic terminal, thereTa5d6ff'Ta5d6ffs a few capabilities your terminal `*must`* support to display micron output correctly, and some that, while not strictly necessary, make the experience a lot better.

Ta5d6ffFormatting such as `_underline`_, `!bold`! or `*italics`* will be displayed if your terminal supports it.

Ta5d6ffIf you are having trouble getting micron output to display correctly, try using `*gnome-terminal`*, which should work with all formatting options out of the box. Most other terminals will work fine as well, but you might have to change some settings to get certain formatting to display correctly.

Ta5d6ff>>>Encoding

Ta5d6ffAll micron sources are intepreted as UTF-8, and micron assumes it can output UTF-8 characters to the terminal. If your terminal does not support UTF-8, output will be faulty.

Ta5d6ff>>>Colors

Ta5d6ffShading and coloring text and backgrounds is integral to micron output, and while micron will attempt to gracefully degrade output even to 1-bit terminals, you will get the best output with terminals supporting at least 256 colors. True-color support is recommended.

Ta5d6ff>>>Terminal Font

Ta5d6ffWhile any unicode capable font can be used with micron, itTa5d6ff'Ta5d6ffs highly recommended to use a `*Ta5d6ff"Ta5d6ffNerd FontTa5d6ff"Ta5d6ff`* (see https://www.nerdfonts.com/), which will add a lot of extra glyphs and icons to your output.

Ta5d6ff> A Few Demo Outputs

Ta5d6ff`F222`Bddd

Ta5d6ff`cWith micron, you can control layout and presentation
Ta5d6ff`a

Ta5d6ff``

Ta5d6ff`B33f

Ta5d6ffYou can change background ...

Ta5d6ff``

Ta5d6ff`B393

Ta5d6ff`r`F320... and foreground colors`f
Ta5d6ff`a

Ta5d6ff`b

Ta5d6ffIf you want to make a break, horizontal dividers can be inserted. They can be plain, like the one below this text, or you can style them with unicode characters and glyphs, like the wavy divider in the beginning of this document.

Ta5d6ff-

Ta5d6ff`cText can be `_underlined`_, `!bold`! or `*italic`*.

Ta5d6ffYou can also `_`*`!`B5d5`F222combine`f`b`_ `_`Ff00f`Ff80o`Ffd0r`F9f0m`F0f2a`F0fdt`F07ft`F43fi`F70fn`Fe0fg`` for some fabulous effects.
Ta5d6ff`a


Ta5d6ff>>>Sections and Headings

Ta5d6ffYou can define an arbitrary number of sections and sub sections, each with their own named headings. Text inside sections will be automatically indented.

Ta5d6ff-

Ta5d6ffIf you place a divider inside a section, it will adhere to the section indents.

Ta5d6ff>>>>>
Ta5d6ffIf no heading text is defined, the section will appear as a sub-section without a header. This can be useful for creating indented blocks of text, like this one.

Ta5d6ff>Micron tags

Ta5d6ffTags are used to format text with micron. Some tags can appear anywhere in text, and some must appear at the beginning of a line. If you need to write text that contains a sequence that would be interpreted as a tag, you can escape it with the character Tffea00\\Ta5d6ff.

Ta5d6ffIn the following sections, the different tags will be introduced. Any styling set within micron can be reset to the default style by using the special Tffea00\\Ta5d6ff`Tffea00\\Ta5d6ff` tag anywhere in the markup, which will immediately remove any formatting previously specified.

Ta5d6ff>>Alignment

Ta5d6ffTo control text alignment use the tag Tffea00\\Ta5d6ff`c to center text, Tffea00\\Ta5d6ff`l to left-align, Tffea00\\Ta5d6ff`r to right-align, and Tffea00\\Ta5d6ff`a to return to the default alignment of the document. Alignment tags must appear at the beginning of a line. Here is an example:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ff`cThis line will be centered.
Ta5d6ffSo will this.
Ta5d6ff`aThe alignment has now been returned to default.
Ta5d6ff`rThis will be aligned to the right
Ta5d6ff``
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333

Ta5d6ff`cThis line will be centered.
Ta5d6ffSo will this.

Ta5d6ff`aThe alignment has now been returned to default.

Ta5d6ff`rThis will be aligned to the right

Ta5d6ff``


Ta5d6ff>>Formatting

Ta5d6ffText can be formatted as `!bold`! by using the Tffea00\\Ta5d6ff`! tag, `_underline`_ by using the Tffea00\\Ta5d6ff`_ tag and `*italic`* by using the Tffea00\\Ta5d6ff`* tag.

Ta5d6ffHereTa5d6ff'Ta5d6ffs an example of formatting text:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ffWe shall soon see `!bold`! paragraphs of text decorated with `_underlines`_ and `*italics`*. Some even dare `!`*`_combine`` them!
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333

Ta5d6ffWe shall soon see `!bold`! paragraphs of text decorated with `_underlines`_ and `*italics`*. Some even dare `!`*`_combine`!`*`_ them!

Ta5d6ff``


Ta5d6ff>>Sections

Ta5d6ffTo create sections and subsections, use the > tag. This tag must be placed at the beginning of a line. To specify a sub-section of any level, use any number of > tags. If text is placed after a > tag, it will be used as a heading.

Ta5d6ffHere is an example of sections:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ff>High Level Stuff
Ta5d6ffThis is a section. It contains this text.

Ta5d6ff>>Another Level
Ta5d6ffThis is a sub section.

Ta5d6ff>>>Going deeper
Ta5d6ffA sub sub section. We could continue, but you get the point.

Ta5d6ff>>>>
Ta5d6ffWait! ItTa5d6ff'Ta5d6ffs worth noting that we can also create sections without headings. They look like this.
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333
Ta5d6ff>High Level Stuff
Ta5d6ffThis is a section. It contains this text.

Ta5d6ff>>Another Level
Ta5d6ffThis is a sub section.

Ta5d6ff>>>Going deeper
Ta5d6ffA sub sub section. We could continue, but you get the point.

Ta5d6ff>>>>
Ta5d6ffWait! ItTa5d6ff'Ta5d6ffs worth noting that we can also create sections without headings. They look like this.
Ta5d6ff``


Ta5d6ff>Colors

Ta5d6ffForeground colors can be specified with the Tffea00\\Ta5d6ff`F tag, followed by three hexadecimal characters. To return to the default foreground color, use the Tffea00\\Ta5d6ff`f tag. Background color is specified in the same way, but by using the Tffea00\\Ta5d6ff`B and Tffea00\\Ta5d6ff`b tags.

Ta5d6ffHereTa5d6ff'Ta5d6ffs a few examples:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ffYou can use `B5d5`F222 color `f`b `Ff00f`Ff80o`Ffd0r`F9f0m`F0f2a`F0fdt`F07ft`F43fi`F70fn`Fe0fg`f for some fabulous effects.
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333

Ta5d6ffYou can use `B5d5`F222 color `f`B333 `Ff00f`Ff80o`Ffd0r`F9f0m`F0f2a`F0fdt`F07ft`F43fi`F70fn`Fe0fg`f for some fabulous effects.

Ta5d6ff``


Ta5d6ff>Links

Ta5d6ffLinks to pages, files or other resources can be created with the Tffea00\\Ta5d6ff`[ tag, which should always be terminated with a closing ]. You can create links with and without labels, it is up to you to control the formatting of links with other tags. Although not strictly necessary, it is good practice to at least format links with underlining.

Ta5d6ffHereTa5d6ff'Ta5d6ffs a few examples:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ffHere is a link without any label: `[1385edace36466a6b3dd:/page/index.mu]

Ta5d6ffThis is a `[labeled link`1385edace36466a6b3dd:/page/index.mu] to the same page, but itTa5d6ff'Ta5d6ffs hard to see if you donTa5d6ff'Ta5d6fft know it

Ta5d6ffHere is `F00a`_`[a more visible link`1385edace36466a6b3dd:/page/index.mu]`_`f
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333

Ta5d6ffHere is a link without any label: `[1385edace36466a6b3dd:/page/index.mu]

Ta5d6ffThis is a `[labeled link`1385edace36466a6b3dd:/page/index.mu] to the same page, but itTa5d6ff'Ta5d6ffs hard to see if you donTa5d6ff'Ta5d6fft know it

Ta5d6ffHere is `F00f`_`[a more visible link`1385edace36466a6b3dd:/page/index.mu]`_`f

Ta5d6ff``

Ta5d6ffWhen links like these are displayed in the built-in browser, clicking on them or activating them using the keyboard will cause the browser to load the specified URL.

Ta5d6ff>Comments

Ta5d6ffYou can insert comments that will not be displayed in the output by starting a line with the # character.

Ta5d6ffHereTa5d6ff'Ta5d6ffs an example:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ff# This line will not be displayed
Ta5d6ffThis line will
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333

Ta5d6ff# This line will not be displayed
Ta5d6ffThis line will

Ta5d6ff``


Ta5d6ff>Literals

Ta5d6ffTo display literal content, for example source-code, or blocks of text that should not be interpreted by micron, you can use literal blocks, specified by the Tffea00\\Ta5d6ff`= tag. Below is the source code of this entire document, presented as a literal block.

Ta5d6ff-

Ta5d6ff`=
Ta5d6ff'''
Te6edf3TOPIC_MARKUP Tff7b72+Tff7b72= Te6edf3TOPIC_MARKUPTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff`=Ta5d6ff"Tb4b4b4, Ta5d6ff"Tffea00\\Ta5d6ff`=Ta5d6ff"Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff[ micron source for document goes here, we donTa5d6ff'Ta5d6fft want infinite recursion now, do we? ]Tffea00\nTffea00\\Ta5d6ff`=Ta5d6ff"
Te6edf3TOPIC_MARKUP Tff7b72+Tff7b72= Ta5d6ff"Tffea00\nTa5d6ff`=Tffea00\nTffea00\nTa5d6ff>Closing RemarksTffea00\nTffea00\nTa5d6ffIf you made it all the way here, you should be well equipped to write documents and pages using micron. Thank you for staying with me.Tffea00\nTffea00\nTa5d6ff`cTffea00\U0001F332Tffea00\nTa5d6ff"


Te6edf3TOPICS Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffIntroductionTa5d6ff"Tb4b4b4: Te6edf3TOPIC_INTRODUCTIONTb4b4b4,
Ta5d6ff"Ta5d6ffConcepts & TerminologyTa5d6ff"Tb4b4b4: Te6edf3TOPIC_CONCEPTSTb4b4b4,
Ta5d6ff"Ta5d6ffConversationsTa5d6ff"Tb4b4b4: Te6edf3TOPIC_CONVERSATIONSTb4b4b4,
Ta5d6ff"Ta5d6ffHosting a NodeTa5d6ff"Tb4b4b4: Te6edf3TOPIC_HOSTINGTb4b4b4,
Ta5d6ff"Ta5d6ffMarkupTa5d6ff"Tb4b4b4: Te6edf3TOPIC_MARKUPTb4b4b4,
Ta5d6ff"Ta5d6ffFirst RunTa5d6ff"Tb4b4b4: Te6edf3TOPIC_FIRST_RUNTb4b4b4,
Ta5d6ff"Ta5d6ffDisplay TestTa5d6ff"Tb4b4b4: Te6edf3TOPIC_DISPLAYTESTTb4b4b4,
Ta5d6ff"Ta5d6ffNetwork ConfigurationTa5d6ff"Tb4b4b4: Te6edf3TOPIC_NETWORKSTb4b4b4,
Ta5d6ff"Ta5d6ffCredits & LicensesTa5d6ff"Tb4b4b4: Te6edf3TOPIC_LICENSESTb4b4b4,
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────